home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / nt / source.exe / POSIX / SH / STD / STDC / SETVBUF.C < prev    next >
C/C++ Source or Header  |  1992-07-13  |  1KB  |  61 lines

  1. /*
  2.  * PD ksh needs an ANSI-compatible setvbuf.
  3.  * if (buf == NULL) it must also allocate a buffer
  4.  * and arrange for fclose to deallocate it.
  5.  * the reason for doing setvbuf(f, (char *)NULL, _IOFBF, BUFSIZ)
  6.  * in the shell is to avoid 4/8K buffers on BSD like systems.
  7.  */
  8.  
  9. /* $Header */
  10.  
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13.  
  14. #if _BSD || _SYSV
  15. int
  16. setvbuf(f, buf, type, size)
  17.     register FILE *f;
  18.     char *buf;
  19.     int type;
  20.     size_t size;
  21. {
  22.     if ((f->_flag&_IOMYBUF) && f->_base != NULL)
  23.         free(f->_base);
  24.     f->_flag &= ~(_IOMYBUF|_IONBF|_IOFBF|_IOLBF);
  25.     switch (type) {
  26.       case _IONBF:
  27.         size = 0;
  28.         buf = NULL;
  29.         break;
  30.       case _IOLBF:
  31.       case _IOFBF:
  32.         if (size == 0)
  33.             size = BUFSIZ;
  34. #if _V7
  35.         else if (size != BUFSIZ)
  36.             return -1;
  37. #endif
  38.         if (buf == NULL) {
  39.             buf = malloc(size);
  40.             if (buf == NULL)
  41.                 return -1;
  42.             f->_flag |= _IOMYBUF;
  43.         }
  44.         break;
  45.       default:
  46.         return -1;
  47.     }
  48.     f->_flag |= type;
  49.     f->_base = f->_ptr = buf;
  50.     f->_cnt = 0;
  51. #if _BSD
  52.     f->_bufsiz = size;
  53. #endif
  54. #if _SYSV
  55.     _bufend(f) = buf + size;
  56. #endif
  57.     return 0;
  58. }
  59. #endif
  60.  
  61.